//
// Description: 雪球的数列
// Created by Loading on 2021/2/26.
//

// 有一种数列，这种数列长度为m，由1到m组成，每个数值出现一次。
// 雪球很喜欢和大栗玩数列游戏，有一天，大栗把两个这种数列拼接在了一起，前a个数由数列1组成，后b个数由数列2组成，新数列的长度为a+b。他想要考验考验雪球，看看雪球能否将数列成功拆分。
// 这对雪球是个考验，他需要找出所有的拆分方案。也有可能大栗在捉弄他，实际上根本无法拆开。

// Input
// 第一行包含一个数字t(1<=t<=10000)，表示了测试用例的数量
// 后边的每个测试点包含两行，第一行包含一个数字n（2<=n<=200000），为合并后数列的长度，第二行包括了n个数字x1，x2, ... , xn(1<=xi<=n-1)
// 所有测试数据的n求和不超过200000
//
// Output
// 对每个测试数据，第一行输出一个整数k，为数列能够成功拆分的方案数量
// 后边k行，每行包括两个数字a和b（1<=a, b<=n, a+b=n），为成功拆分的方案

// Example
//
// Input
// 6
// 4
// 1 3 2 1
// 6
// 2 4 1 3 2 1
// 4
// 2 1 1 3
// 4
// 1 3 3 1
// 12
// 2 1 3 4 5 6 7 8 9 1 10 2
// 3
// 1 1 1
//
// Output
// 2
// 1 3
// 3 1
// 1
// 4 2
// 0
// 0
// 1
// 2 10
// 0
//
// Note
// 对于第一个数列，两种可能的拆分为{1}+{3,2,1}，和{1,3,2}+{1}

#include <bits/stdc++.h>

using namespace std;

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        map<int, int> m;//记录每个数字出现次数，
        vector<int> v;

        int index = 0;
        bool failed = false;
        for (int i = 0; i < n; ++i) {
            int temp;
            cin >> temp;
            v.emplace_back(temp);
            if (m[temp] == 0) {
                m[temp]++;
            } else if (m[temp] > 1) {//出现次数2以上，失败
                failed = true;
            } else {
                index++;
            }
        }

        if (failed || index == 0) {
            cout << 0 << endl;
            continue;
        }

        //最多两种情况，前边index个，后边n - index个，或者相反。
        vector<vector<int>> res;
        //temp1和temp2记录从index处分开的两个数组
        vector<int> v1, v2, temp1, temp2;
        for (int i = 1; i <= index; ++i) {
            v1.emplace_back(i);
            temp1.emplace_back(v[i - 1]);
        }
        for (int i = 1; i <= n - index; ++i) {
            v2.emplace_back(i);
            temp2.emplace_back(v[n - i]);
        }
        sort(temp1.begin(), temp1.end());
        sort(temp2.begin(), temp2.end());
        if (v1 == temp1 && v2 == temp2) {
            res.emplace_back(vector<int>{index, n - index});
        }
        temp1.clear();
        temp2.clear();

        //反向
        for (int i = 1; i <= index; ++i) {
            temp1.emplace_back(v[n - i]);
        }
        for (int i = 1; i <= n - index; ++i) {
            temp2.emplace_back(v[i - 1]);
        }
        sort(temp1.begin(), temp1.end());
        sort(temp2.begin(), temp2.end());
        //如果index正好处于中间，则只有一种情况，因为两种情况是一致的。
        if (v1 == temp1 && v2 == temp2 && index * 2 != n) {
            res.emplace_back(vector<int>{n - index, index});
        }

        cout << res.size() << endl;
        if (!res.empty()) {
            cout << res[0][0] << " " << res[0][1] << endl;
            if (res.size() == 2) {
                cout << res[1][0] << " " << res[1][1] << endl;
            }
        }
    }
}